package services.common;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import models.common.entity.t_company_info;
import models.common.entity.t_shareholder;
import models.common.entity.t_user;
import models.common.entity.t_user_info;
import net.sf.json.JSONArray;
import net.sf.json.JSONObject;

import org.apache.commons.lang.StringUtils;

import services.base.BaseService;

import common.enums.HoldControllingType;
import common.enums.SholderBindStatus;
import common.utils.Factory;
import common.utils.ResultInfo;
import common.utils.StrUtil;

import daos.common.ShareholderDao;

/**
 * 股东表service层
 * 
 * @author xiaojun
 * @version 2017-4-18 下午5:40:
 */
public class ShareholderService extends BaseService<t_shareholder> {

	protected static ShareholderDao shareholderDao = Factory
			.getDao(ShareholderDao.class);

	protected static UserService userService = Factory
			.getService(UserService.class);

	protected static UserInfoService userInfoService = Factory
			.getService(UserInfoService.class);

	protected static CompanyInfoService companyInfoService = Factory
			.getService(CompanyInfoService.class);

	public ShareholderService() {
		super.basedao = shareholderDao;
	}

	/**
	 * 根据企业id查询已绑定的股东信息
	 * 
	 * @param company_id
	 *            企业id
	 * @return
	 * @author xiaojun
	 * @version 2017-4-25 下午5:39:18
	 */
	public List<t_shareholder> findBindByCompanyId(long company_id) {

		return shareholderDao.findBindByCompanyId(company_id);
	}

	/**
	 * 修改股东信息
	 * 
	 * @param companyId
	 * @param sh_name
	 * @param sh_email
	 * @param sh_mobile
	 * @return
	 * @author zhiliang.lan
	 * @createDate 2017年5月8日
	 */
	public ResultInfo updateShareholer(long userId, int sh_type,
			String sh_name, String sh_email, String sh_mobile) {
		ResultInfo result = new ResultInfo();

		/* 判断否是为本人的手机号码 */
		t_user user = userService.findUserById(userId);
		if (user.mobile.equals(sh_mobile)) {
			result.code = -1;
			result.msg = "不能使用本人的手机号码作为股东手机号";

			return result;
		}

		int i = shareholderDao.updateShareholder(userId, sh_type, sh_name,
				sh_email, sh_mobile);
		if (i < 0) {
			result.code = -1;
			result.msg = "股东信息修改失败";

			return result;
		}

		result.code = 1;
		result.msg = "股东信息修改成功";

		return result;
	}

	/**
	 * 新增股东
	 * 
	 * @param companyId
	 * @param sh_type
	 * @param sh_name
	 * @param sh_email
	 * @param sh_mobile
	 * @return
	 * @author zhiliang.lan
	 * @createDate 2017年5月8日
	 */
	public ResultInfo addShareholer(t_shareholder shareholder) {
		ResultInfo result = new ResultInfo();

		boolean isFlag = shareholderDao.save(shareholder);
		if (!isFlag) {
			result.code = -1;
			result.msg = "新增股东失败";
			return result;
		}

		result.code = 1;
		result.msg = "股东信息新增成功";
		return result;
	}

	/**
	 * 根据userId查询企业下所有个人股东
	 * 
	 * @param user_id
	 * @return
	 * @author zhiliang.lan
	 * @createDate 2017年6月24日
	 */
	public List<Map<String, Object>> findPersonShareHolderByUserId(long userId) {

		return shareholderDao.findPersonShareHolderByUserId(userId);
	}

	/**
	 * 根据userId查询企业下所有企业股东
	 * 
	 * @param user_id
	 * @return
	 * @author zhiliang.lan
	 * @createDate 2017年7月3日
	 */
	public List<Map<String, Object>> findCompanyShareHolderByUserId(long userId) {

		return shareholderDao.findCompanyShareHolderByUserId(userId);
	}

	/**
	 * 计算一个公司下面的实际控制人数量
	 * 
	 * @param id
	 * @return
	 * @author zhiliang.lan
	 * @createDate 2017年6月24日
	 */
	public int findActualCount(long userId) {

		return shareholderDao.findActualCount(userId);
	}

	/**
	 * 计算一个公司下面的股东数量
	 * 
	 * @param id
	 * @return
	 * @author zhiliang.lan
	 * @createDate 2017年6月24日
	 */
	public int shHolderCount(long userId) {

		return shareholderDao.shHolderCount(userId);
	}

	/**
	 * 根据sholder的id个人解绑股东
	 * 
	 * @param id
	 * @return
	 * @author zhiliang.lan
	 * @createDate 2017年6月28日
	 */
	public int unBundSholderById(long id) {

		return shareholderDao.unBundSholderById(id);
	}

	/**
	 * 根据姓名和手机号 或者 姓名和邮箱地址
	 * 
	 * @param reality_name
	 * @param mobile
	 * @param email
	 * @return
	 * @author zhiliang.lan
	 * @createDate 2017年6月28日
	 */
	public List<t_shareholder> findShareHolderByNameAndMobile(
			String reality_name, String mobile) {

		return shareholderDao.findShareHolderByNameAndMobile(reality_name,
				mobile);
	}

	/**
	 * 企业查询企业名下的个人股东list
	 * 
	 * @param user_id
	 * @return
	 * @author zhiliang.lan
	 * @createDate 2017年6月28日
	 */
	public List<t_shareholder> findShareHolderByCompanyUserId(
			long company_user_id) {

		return shareholderDao.findShareHolderByCompanyUserId(company_user_id);
	}

	/**
	 * 企业审核通过绑定股东
	 * 
	 * @param id
	 * @return
	 * @author zhiliang.lan
	 * @createDate 2017年6月28日
	 */
	public int bundSholderById(long id) {

		return shareholderDao.bundSholderById(id);
	}

	/**
	 * 根据id删除
	 * 
	 * @param id
	 * @return
	 * @author zhiliang.lan
	 * @createDate 2017年6月28日
	 */
	public ResultInfo deleSholderById(long id) {

		ResultInfo result = new ResultInfo();

		int isFlag = shareholderDao.delete(id);

		if (isFlag < 0) {
			result.code = -1;
			result.msg = "删除股东失败";
			return result;
		}

		result.code = 1;
		result.msg = "股东信息删除成功";
		return result;
	}

	/**
	 * 根据股东id，更新股东表一条记录信息
	 * 
	 * @param userId
	 *            用户Id
	 * @return
	 * @author zhiliuang.lan
	 * @createDate 2017年4月21日15:44:43
	 */
	public ResultInfo updateShareholer(t_shareholder shareholder) {
		ResultInfo result = new ResultInfo();
		// boolean isFlag = userInfoDao.save(userInfo);
		boolean isFlag = shareholderDao.save(shareholder);
		if (!isFlag) {
			result.code = -1;
			result.msg = "更新股东信息失败";

			return result;
		}
		result.code = 1;
		result.msg = "更新股东信息成功";

		return result;
	}

	/**
	 * 查询该企业下状态为已提交的股东信息
	 * 
	 * @param userId
	 * @return
	 * @author zhiliang.lan
	 * @createDate 2017年7月3日
	 */
	public List<t_shareholder> findSholerHaveSubmitBycompanyId(long userId) {

		return shareholderDao.findSholerHaveSubmitBycompanyId(userId);
	}

	/**
	 * 查控股人，企业或者个人，只有一个
	 * 
	 * @return
	 * @author zhiliang.lan
	 * @createDate 2017年7月13日
	 */
	public t_shareholder findControllerByUserId(long userId) {

		return shareholderDao.findControllerByUserId(userId);
	}

	/**
	 * 根据userId查询企业下除了控制人以外的股东
	 * 
	 * @param user_id
	 * @return
	 * @author zhiliang.lan
	 * @createDate 2017年7月13日
	 */
	public List<Map<String, Object>> findShareHolderExceptControllerByUserId(
			long userId) {

		return shareholderDao.findShareHolderExceptControllerByUserId(userId);
	}

	/**
	 * 根据userId查询企业下除了控制人以外的股东，返回list
	 * 
	 * @param user_id
	 * @return
	 * @author zhiliang.lan
	 * @createDate 2017年7月18日14:58:08
	 */
	public List<t_shareholder> findShareHolderListByUserId(long userId) {

		return shareholderDao.findShareHolderListByUserId(userId);
	}

	/**
	 * 股东信息保存
	 * 
	 * @param sholderJson
	 * @return
	 * @author zhiliang.lan
	 * @createDate 2017年8月3日
	 */
	public ResultInfo saveSholder(long userId, String sholderJson) {
		ResultInfo result = new ResultInfo();
		System.out.println(sholderJson);
		JSONArray fromObject = JSONArray.fromObject(sholderJson);
		String str = "";
		for (Object object : fromObject) {

			String shId = (String) ((JSONObject) object).get("id");
			String sh_type_str = (String) ((JSONObject) object).get("sh_type");
			int sh_type = Integer.parseInt(sh_type_str);
			String sh_name = (String) ((JSONObject) object).get("sh_name");
			String sh_email = (String) ((JSONObject) object).get("sh_email");
			String sh_mobile = (String) ((JSONObject) object).get("sh_mobile");
			String company_full_name = (String) ((JSONObject) object)
					.get("company_full_name");
			String business_license_code = (String) ((JSONObject) object)
					.get("business_license_code");
			String legal_person_name = (String) ((JSONObject) object)
					.get("legal_person_name");
			String legal_person_mobile = (String) ((JSONObject) object)
					.get("legal_person_mobile");
			if (str.contains(sh_name) && !sh_name.equals("")) {
				result.code = -1;
				result.msg = sh_name + " 股东重复！";
				return result;
			} else {
				str += sh_name;
			}

			if (str.contains(company_full_name)
					&& !company_full_name.equals("")) {
				result.code = -1;
				result.msg = company_full_name + " 股东重复！";
				return result;
			} else {
				str += company_full_name;
			}
			// 校验方法
			result = checkSholder(sh_type, sh_name, sh_email, sh_mobile,
					company_full_name, business_license_code,
					legal_person_name, legal_person_mobile);
			if (result.code < 1) {
				return result;
			}

			// 找到该股东
			t_shareholder shareholder = new t_shareholder();
			if (StringUtils.isNotBlank(shId)) {
				shareholder = findByID(Long.parseLong(shId));
			}
			shareholder.setHoldControllingType(HoldControllingType.getEnum(sh_type));
			if (shareholder.getHoldControllingType().code == HoldControllingType.IS_SHAREHOLDER_PERSON.code
					|| shareholder.getHoldControllingType().code == HoldControllingType.REAL_CONTROLLER_PERSON.code
					|| shareholder.getHoldControllingType().code == HoldControllingType.OTHER_SHAREHOLDER_PERSION.code) {
				t_user_info user_info = userInfoService.findUserInfoByUserId(shareholder.user_id);
				if (shareholder.user_id == 0 || user_info == null || !user_info.reality_name.equals(shareholder.sh_name) || !user_info.mobile.equals(shareholder.sh_mobile)) {
					shareholder.user_id = 0;
				}
			} else {
				t_company_info company_info = companyInfoService
						.findCompanyInfoByUserId(shareholder.user_id);
				if (null == company_info
						|| !company_info.full_name
								.equals(shareholder.company_full_name)) {
					shareholder.user_id = 0;
				}
			}

			shareholder.company_user_id = userId;
			shareholder.setSholderBondStatus(SholderBindStatus.HAVE_SUBMIT);// 绑定状态

			/** 股东信息开始 **/
			if (sh_type == HoldControllingType.IS_SHAREHOLDER_PERSON.code
					|| sh_type == HoldControllingType.REAL_CONTROLLER_PERSON.code
					|| sh_type == HoldControllingType.OTHER_SHAREHOLDER_PERSION.code) { // 个人股东

				shareholder.sh_name = sh_name;
				shareholder.sh_email = sh_email;
				shareholder.sh_mobile = sh_mobile;

				if (sh_type == HoldControllingType.IS_SHAREHOLDER_PERSON.code) {
					shareholder
							.setHoldControllingType(HoldControllingType.IS_SHAREHOLDER_PERSON);
				} else if (sh_type == HoldControllingType.REAL_CONTROLLER_PERSON.code) {
					shareholder
							.setHoldControllingType(HoldControllingType.REAL_CONTROLLER_PERSON);
				} else if (sh_type == HoldControllingType.OTHER_SHAREHOLDER_PERSION.code) {
					shareholder
							.setHoldControllingType(HoldControllingType.OTHER_SHAREHOLDER_PERSION);
				}
			} else if (sh_type == HoldControllingType.IS_SHAREHOLDER_COMPANY.code
					|| sh_type == HoldControllingType.REAL_CONTROLLER_COMPANY.code
					|| sh_type == HoldControllingType.OTHER_SHAREHOLDER_COMPANY.code) { // 企业股东

				shareholder.company_full_name = company_full_name;
				shareholder.business_license_code = business_license_code;
				shareholder.legal_person_name = legal_person_name;
				shareholder.legal_person_mobile = legal_person_mobile;

				if (sh_type == HoldControllingType.IS_SHAREHOLDER_COMPANY.code) {
					shareholder
							.setHoldControllingType(HoldControllingType.IS_SHAREHOLDER_COMPANY);
				} else if (sh_type == HoldControllingType.REAL_CONTROLLER_COMPANY.code) {
					shareholder
							.setHoldControllingType(HoldControllingType.REAL_CONTROLLER_COMPANY);
				} else if (sh_type == HoldControllingType.OTHER_SHAREHOLDER_COMPANY.code) {
					shareholder
							.setHoldControllingType(HoldControllingType.OTHER_SHAREHOLDER_COMPANY);
				}
			}
			/** 股东信息结束 **/
			result = updateShareholer(shareholder);
			if (result.code < 1) {
				result.code = -1;
				result.msg = "保存信息失败";
				return result;
			}

		}
		return result;
	}

	/**
	 * 校验股东的方法
	 * 
	 * @author zhiliang.lan
	 * @createDate 2017年7月20日
	 */
	private static ResultInfo checkSholder(int sh_type, String sh_name,
			String sh_email, String sh_mobile, String company_full_name,
			String business_license_code, String legal_person_name,
			String legal_person_mobile) {
		ResultInfo result = new ResultInfo();

		if (sh_type == HoldControllingType.IS_SHAREHOLDER_PERSON.code
				|| sh_type == HoldControllingType.REAL_CONTROLLER_PERSON.code
				|| sh_type == HoldControllingType.OTHER_SHAREHOLDER_PERSION.code) {// 个人股东或者个人控股
			if (StringUtils.isBlank(sh_name)) {
				result.code = -1;
				result.msg = "请填写股东姓名";
				return result;
			}
			if (StringUtils.isBlank(sh_email)) {
				result.code = -1;
				result.msg = "请填写股东邮箱地址";
				return result;
			}
			if (!StrUtil.isEmail(sh_email)) {
				result.code = -1;
				result.msg = "邮箱地址格式不正确";
				return result;
			}
			if (StringUtils.isBlank(sh_mobile)) {
				result.code = -1;
				result.msg = "请填写股东手机号码";
				return result;
			}
			if (!StrUtil.isMobileNum(sh_mobile)) {
				result.code = -1;
				result.msg = "手机号码格式不正确";
				return result;
			}

		} else if (sh_type == HoldControllingType.IS_SHAREHOLDER_COMPANY.code
				|| sh_type == HoldControllingType.REAL_CONTROLLER_COMPANY.code
				|| sh_type == HoldControllingType.OTHER_SHAREHOLDER_COMPANY.code) { // 企业股东
			if (StringUtils.isBlank(company_full_name)) {
				result.code = -1;
				result.msg = "请填写企业全称";
				return result;
			}
			if (StringUtils.isBlank(business_license_code)) {
				result.code = -1;
				result.msg = "请填写营业执照编号";
				return result;
			}
			if (StringUtils.isBlank(legal_person_name)) {
				result.code = -1;
				result.msg = "请填写法定代表人姓名";
				return result;
			}
			if (StringUtils.isBlank(legal_person_mobile)) {
				result.code = -1;
				result.msg = "请填写法定代表人手机号码";
				return result;
			}
			if (!StrUtil.isMobileNum(legal_person_mobile)) {
				result.code = -1;
				result.msg = "手机号码格式不正确";
				return result;
			}
		} else {
			result.code = -1;
			result.msg = "校验失败";
			return result;
		}
		result.code = 1;
		result.msg = "校验通过";

		return result;
	}

	/**
	 * 查询（实际控制人）信息 -app
	 * 
	 * @param userId
	 * @return
	 * @author zhiliang.lan
	 * @createDate 2017年8月3日
	 */
	public Map<String, Object> findControllerByUserIdApp(long userId) {

		return shareholderDao.findControllerByUserIdApp(userId);
	}

	/**
	 * 查询企业股东信息list -app
	 * 
	 * @param userId
	 * @return
	 * @author zhiliang.lan
	 * @createDate 2017年8月3日
	 */
	public List<Map<String, Object>> findCompanySholderListByUserIdApp(
			long userId) {

		return shareholderDao.findCompanySholderListByUserIdApp(userId);
	}

	/**
	 * 查询股东签字信息 list -app
	 * 
	 * @param cplid
	 *            额度表id
	 * @return
	 * @author zhiliang.lan
	 * @createDate 2017年8月3日
	 */
	public List<Map<String, Object>> findSholderSignListByUser(long cplid) {

		return shareholderDao.findSholderSignListByUser(cplid);
	}

	/**
	 * 查询股东签字丙方（出借方）信息
	 * 
	 * @param cplid
	 *            额度表id
	 * @return
	 * @author zhiliang.lan
	 * @createDate 2017年8月3日
	 */
	public List<Map<String, Object>> findSholderSignListByBid(long bid_id) {

		return shareholderDao.findSholderSignListByBid(bid_id);
	}

	/**
	 * 修改股东电话
	 * 
	 * @param user_id
	 * @param sh_mobile
	 * @return
	 * @author xiaojun
	 * @version 2017-12-18
	 */
	public boolean upSh_mobile(long user_id, String sh_mobile) {
		int i = shareholderDao.upSh_mobile(user_id, sh_mobile);
		if (i < 0) {
			return false;
		}
		return true;
	}

	/**
	 * 修改签字电话
	 * 
	 * @param user_id
	 * @param sh_mobile
	 * @return
	 * @author xiaojun
	 * @version 2017-12-18
	 * @param user_id 
	 */
	public boolean upShareholderSign(Long user_id, String shareholder_mobile) {
		int i = shareholderDao.upShareholderSign(user_id, shareholder_mobile);
		if (i < 0) {
			return false;
		}
		return true;
	}

	/**
	 * 查询其它保证人
	 * 
	 * @return
	 * @author fanghanyong
	 * @createDate 2018年01月17日
	 */
	public List<t_shareholder> findOthershareByUserId(long userId) {

		return shareholderDao.findOthershareByUserId(userId);
	}
	
	/**
	 * 根据userId查询企业下其他个人保证人
	 * 
	 * @param userId
	 * @return
	 * @author fanghanyong
	 * @createDate 2018年01月26日
	 */
	public List<Map<String, Object>> findOtherPerShareHolderByUserId(long userId) {
		
		return shareholderDao.findOtherPerShareHolderByUserId(userId);
	}
	
	
	/**
	 * 根据userId查询企业下其他公司保证人
	 * 
	 * @param userId
	 * @return
	 * @author fanghanyong
	 * @createDate 2018年01月26日
	 */
	public List<Map<String, Object>> findOtherComShareHolderByUserId(long userId) {
		
		return shareholderDao.findOtherComShareHolderByUserId(userId);
	}
	/**
	 * 根据userId查询企业下股东
	 * 
	 * @param user_id
	 * @return
	 * @author zhiliang.lan
	 * @createDate 2017年6月24日
	 */
	public List<Map<String, Object>> findShareHolderByUserId(long userId,int type) {

		return shareholderDao.findShareHolderByUserId(userId,type);
	}
	
	/**
	 * 根据userId查询企业下实际控制人
	 * 
	 * @param userId
	 * @return
	 * @author fanghanyong
	 * @createDate 2018年01月27日
	 */
	public t_shareholder findControllerByUserIdApp(long userId,int typeCom, int typePer) {
		
		return shareholderDao.findControllerByUserIdApp(userId, typeCom, typePer);
	}
	
	/**
	 * 更新该企业的相关的参股公司信息的股东信息表
	 * @param company_full_name 企业全称
	 * @return
	 * @author fanghanyong
	 *@version 2018-1-30 
	 */
	public List<t_shareholder> findShareHold(
			String company_full_name) {
		
		return shareholderDao.findShareHold(company_full_name);
	}
	
	/**
	 * 更新该个人用户的相关的参股公司信息的股东信息表
	 * @param sh_name 企业全称
	 * @return
	 * @author fanghanyong
	 *@version 2018-1-30 
	 */
	public List<t_shareholder> findPerShareHold(
			String sh_name) {
		
		return shareholderDao.findPerShareHold(sh_name);
	}
}
